package com.atguigu.day03;

import com.atguigu.bean.Event;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.ParallelSourceFunction;
import org.apache.flink.streaming.api.functions.source.SourceFunction;

import java.util.Random;

public class Flink01_Source_Customer {
    public static void main(String[] args) throws Exception {
        //1.获取流的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);


        //2.TODO 通过自定义数据源获取数据
        DataStreamSource<Event> streamSource = env.addSource(new ClickSource()).setParallelism(3);

        streamSource.print();

        env.execute();
    }


    //自定义一个类实现SourceFun接口 默认并行度只能设置为1
//    public static class ClickSource implements SourceFunction<Event>{
    //如果想要设置多并行度，可以实现ParallelSourceFunction这个接口
    public static class ClickSource implements ParallelSourceFunction<Event>{

//        private Random random = new Random();
        private Boolean isRunning = true;

        /**
         * 生成数据或者获取数据的主要方法是这个方法中定义的 也就是说通过这个方法可以获取数据
         * 并且在这个方法中通常都会有一个while循环
         * @param ctx 可以利用上下文对象中的collect方法将生成或者获取的数据发送至下游
         * @throws Exception
         */
        @Override
        public void run(SourceContext<Event> ctx) throws Exception {
            Random random = new Random();

            String[] users = {"Songsong", "Bingbing"};
            String[] urls = {"./home", "./cart", "./fav", "./prod?id=1", "./prod?id=2"};
            while (isRunning){
                ctx.collect(new Event(users[random.nextInt(users.length)],urls[random.nextInt(urls.length)],System.currentTimeMillis()));
                Thread.sleep(200);
            }
        }

        /**
         * 因为run方法中通常有一个while循环，可以在cancel这个方法中控循环终止
         * 这个方法不是我们手动调的，是系统内部自动调用。
         */
        @Override
        public void cancel() {
            isRunning = false;
        }
    }

}
